/**
 * 屏幕适配工具
 */
import { getNavBarHeight, getSafeAreaInsets, getScreenInfo } from './platform'

/**
 * rpx转px
 */
export function rpxToPx(rpx: number): number {
  return uni.upx2px(rpx)
}

/**
 * px转rpx
 */
export function pxToRpx(px: number): number {
  const screenInfo = getScreenInfo()
  return (px * 750) / screenInfo.screenWidth
}

/**
 * 获取单位值（自动处理rpx、px等单位）
 */
export function getUnitValue(value: string | number, unit = false): string | number {
  if (typeof value === 'number') {
    return unit ? `${value}px` : value
  }

  // 处理rpx/upx单位
  if (/(?:rpx|upx)$/i.test(value)) {
    const numValue = Number.parseInt(value)
    return unit ? `${rpxToPx(numValue)}px` : rpxToPx(numValue)
  }

  // 处理px单位
  if (/px$/i.test(value)) {
    const numValue = Number.parseInt(value)
    return unit ? `${numValue}px` : numValue
  }

  // 处理百分比
  if (value.endsWith('%')) {
    return value
  }

  // 处理其他情况
  const numValue = Number.parseInt(value)
  return unit ? `${numValue}px` : numValue
}

/**
 * 添加单位
 */
export function addUnit(value: string | number, unit = 'px'): string {
  if (typeof value === 'number') {
    return `${value}${unit}`
  }

  // 如果已有单位，直接返回
  if (/(?:rpx|upx|px|%|vh|vw)$/i.test(value)) {
    return value
  }

  return `${value}${unit}`
}

/**
 * 获取可用内容区域高度
 */
export function getContentHeight(excludeNavbar = true, excludeTabbar = false): number {
  const screenInfo = getScreenInfo()
  const safeAreaInsets = getSafeAreaInsets()

  let height = screenInfo.windowHeight

  // 排除导航栏
  if (excludeNavbar) {
    height -= getNavBarHeight()
  }

  // 排除底部TabBar（一般高度为50px）
  if (excludeTabbar) {
    height -= 50
  }

  // 排除底部安全区域
  height -= safeAreaInsets.bottom

  return height
}

/**
 * 获取一屏高度（等同于视口高度）
 */
export function getViewportHeight(): number {
  return getScreenInfo().windowHeight
}

/**
 * 获取屏幕宽度
 */
export function getScreenWidth(): number {
  return getScreenInfo().screenWidth
}

/**
 * 获取屏幕高度
 */
export function getScreenHeight(): number {
  return getScreenInfo().screenHeight
}

/**
 * 获取设备像素比
 */
export function getPixelRatio(): number {
  return getScreenInfo().pixelRatio || 1
}

/**
 * 响应式设计断点
 */
export const breakpoints = {
  xs: 0,
  sm: 576,
  md: 768,
  lg: 992,
  xl: 1200,
  xxl: 1600,
}

/**
 * 获取当前屏幕尺寸类型
 */
export function getScreenSize(): keyof typeof breakpoints {
  const width = getScreenWidth()

  if (width >= breakpoints.xxl)
    return 'xxl'
  if (width >= breakpoints.xl)
    return 'xl'
  if (width >= breakpoints.lg)
    return 'lg'
  if (width >= breakpoints.md)
    return 'md'
  if (width >= breakpoints.sm)
    return 'sm'
  return 'xs'
}

/**
 * 判断是否为小屏设备
 */
export function isSmallScreen(): boolean {
  const screenSize = getScreenSize()
  return screenSize === 'xs' || screenSize === 'sm'
}

/**
 * 样式转换工具
 */
export function addStyle(customStyle: any, target = 'object') {
  // 字符串转字符串，对象转对象情形，直接返回
  if (
    !customStyle
    || (typeof customStyle === 'object' && target === 'object')
    || (target === 'string' && typeof customStyle === 'string')
  ) {
    return customStyle
  }

  // 字符串转对象
  if (target === 'object') {
    // 去除字符串样式中的两端空格
    customStyle = customStyle.trim()
    // 根据";"将字符串转为数组形式
    const styleArray = customStyle.split(';')
    const style: any = {}
    // 历遍数组，拼接成对象
    for (let i = 0; i < styleArray.length; i++) {
      if (styleArray[i]) {
        const item = styleArray[i].split(':')
        style[item[0].trim()] = item[1].trim()
      }
    }
    return style
  }

  // 这里为对象转字符串形式
  let string = ''
  for (const i in customStyle) {
    // 驼峰转为中划线的形式，否则css内联样式，无法识别驼峰样式属性名
    const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
    string += `${key}:${customStyle[i]};`
  }
  return string.trim()
}
